<?php

/**
 * Class OpenBoletoLib
 * @package Codeigniter 
 * @depends Agente
 * @depends Boleto
 * @author Carlos Carvalho <contato@carlosocarvalho.com.br>
 * @version 1.0
 * @category Libraries System
 * 
 */
require 'autoloader.php';

//use OpenBoleto\Agente;

class OpenBoletoLib {

    /**
     *
     * @var array $config  
     * configurações do boleto
     */
    private $config = array(
// Parâmetros obrigatórios
        'dataVencimento' => false,
        'valor' => 10.00,
        'sequencial' => 75896452, // Até 11 dígitos
        'sacado' => '', // object type Agente
        'cedente' => '', // object type Agente
        'agencia' => '1593', // Até 4 dígitos
        'carteira' => 6, // 3, 6 ou 9
        'conta' => 256001, // Até 7 dígitos
        // Parâmetros recomendáveis
        //'logoPath' => 'http://empresa.com.br/logo.jpg', // Logo da sua empresa
        'contaDv' => 1,
        'agenciaDv' => 2,
        'descricaoDemonstrativo' => array(// Até 5
            'Compra de materiais cosméticos',
            'Compra de alicate',
        ),
        'instrucoes' => array(// Até 8
            'Após o dia [date] cobrar 2% de mora e 1% de juros ao dia.',
            'Não receber após o vencimento.',
        ),
            // Parâmetros opcionais
            //'resourcePath' => '../resources',
            //'cip' => '000', // Apenas para o Bradesco
            //'moeda' => Bradesco::MOEDA_REAL,
            //'dataDocumento' => new DateTime(),
            //'dataProcessamento' => new DateTime(),
            //'contraApresentacao' => true,
            //'pagamentoMinimo' => 23.00,
            //'aceite' => 'N',
            //'especieDoc' => 'ABC',
            //'numeroDocumento' => '123.456.789',
            //'usoBanco' => 'Uso banco',
            //'layout' => 'layout.phtml',
            //'logoPath' => 'http://boletophp.com.br/img/opensource-55x48-t.png',
            //'sacadorAvalista' => new Agente('Antônio da Silva', '02.123.123/0001-11'),
            //'descontosAbatimentos' => 123.12,
            //'moraMulta' => 123.12,
            //'outrasDeducoes' => 123.12,
            //'outrosAcrescimos' => 123.12,
            //'valorCobrado' => 123.12,
            //'valorUnitario' => 123.12,
            //'quantidade' => 1,
    );

    /**
     *
     * @var object Boleto 
     */
    private $boletoName;

    function __construct($nameBoleto = 'Bradesco') {
        $this->boletoName = $nameBoleto;
        log_message('debug', 'Class OpenBoletoLib Loaded');
    }

    /**
     * Initialize
     * @param array $config configurações do boleto inicial
     */
    function initialize($config = array()) {
        $this->config = array_merge($this->config, $config);
        foreach ($config as $key => $value):
            $this->config[$key] = $value;
        endforeach;
    }

    /**
     * cedente 
     * Dados do responsavel pelo boleto
     * @access public
     * @param string $nome
     * @param string $documento
     * @param string $endereco
     * @param string $cep
     * @param string $cidade
     * @param string $uf
     * @return void 
     */
    function cedente($nome, $documento, $endereco = null, $cep = null, $cidade = null, $uf = null) {
        $this->config['cedente'] = new \OpenBoleto\Agente($nome, $documento, $endereco, $cep, $cidade, $uf);
    }

    /**
     * sacado
     * Adiciona informações de cobrança
     * @param string $nome
     * @param string $documento
     * @param string $endereco
     * @param string $cep
     * @param string $cidade
     * @param string $uf
     * @return void 
     */
    function sacado($nome, $documento, $endereco = null, $cep = null, $cidade = null, $uf = null) {
        $this->config['sacado'] = new \OpenBoleto\Agente($nome, $documento, $endereco, $cep, $cidade, $uf);
    }

    /**
     * Generate
     * Responsavel pela geração do boleto
     * @return string boleto gerado.
     */
    function generate() {
        if (!$this->config['dataVencimento']):$this->config['dataVencimento'] = new DateTime(date('Y-m-d'));
        endif;
        $bancoBoleto = strtolower($this->boletoName);
        switch ($bancoBoleto):
            case 'bradesco':
                $objBoleto = new OpenBoleto\Banco\Bradesco($this->config);
                break;
            case 'santander':
            case 'bancosantander':
                $objBoleto = new \OpenBoleto\Banco\Santander($this->config);
                break;
            case 'bb':
            case 'bancodobrasil':
                $objBoleto = new \OpenBoleto\Banco\BancoDoBrasil($this->config);
                break;
            default :
                return 'Nenhum Boleto configurado';
        endswitch;
        return $objBoleto->getOutput();
    }

}
